package com.oig.common.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;
import java.util.regex.Pattern;

public class FlexibleDateUtil {

    // 支持的日期格式
    private static final String[] DATE_FORMATS = {
            "yyyy-MM-dd HH:mm:ss",
            "yyyy-MM-dd",
            "yyyy-MM-dd'T'HH:mm:ss",
    };

    /**
     * 将未知格式的字符串解析为 Date 对象
     */
    public static Date parse(String input) {
        // 判断是否是纯数字字符串（可能是时间戳）
        if (input.matches("\\d+")) {
            return parseTimestamp(input);
        }
        // 否则尝试按日期字符串解析
        return parseDateString(input);
    }

    /**
     * 将日期字符串解析为 Date 对象
     */
    private static Date parseDateString(String dateString) {
        for (String format : DATE_FORMATS) {
            try {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
                // 检查字符串是否包含时间部分
                if (!hasTime(dateString)) {
                    LocalDate localDate = LocalDate.parse(dateString, formatter);
                    return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
                }
                LocalDateTime localDateTime = LocalDateTime.parse(dateString, formatter);
                return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
            } catch (DateTimeParseException e) {
                // 忽略当前格式，尝试下一个
                System.out.println("不匹配格式："+format);
            }
        }
        throw new IllegalArgumentException("无法解析日期字符串: " + dateString);
    }

    /**
     * 将时间戳字符串解析为 Date 对象
     */
    private static Date parseTimestamp(String timestampString) {
        try {
            long timestamp = Long.parseLong(timestampString);
            return new Date(timestamp);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无效的时间戳字符串: " + timestampString, e);
        }
    }

    /**
     * 判断字符串是否包含时分秒
     */
    public static boolean hasTime(String dateTimeStr) {
        // 正则表达式匹配 HH:mm:ss 的格式
        String timePattern = ".*\\d{2}:\\d{2}:\\d{2}.*";
        return Pattern.matches(timePattern, dateTimeStr);
    }

}
